package annotation05;

import org.junit.Test;

import java.lang.reflect.Method;

/**
 * 获取类上和方法上的注解
 * Class类中的方法:
 *  boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
 *           判断该类上是否有指定的注解,如果有返回true,否则返回false
 *  public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
 *         获取该类上指定的注解
 * Method类中:
 *  public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
 *   判断该方法上是否有指定的注解,如果有返回true,否则返回false
 *  public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
 *     获取该方法上指定的注解
 */
public class Demo {
	@Test
	public void testGetClassAnnotation() {
		//1.获取Person类的字节码对象
		Class<Person> personClass = Person.class;
		//2.判断该类上是否有@MyAnnotation该注解,如果有再去获取,如果没有什么操作也不做
		boolean flag = personClass.isAnnotationPresent(MyAnnotation.class);
		//3.判断flag,如果flag为真再去获取注解
		if (flag) {
			//4.获取类上注解
			MyAnnotation annotation = personClass.getAnnotation(MyAnnotation.class);
			//5.获取当前注解上属性值
			System.out.println(annotation.name());
			System.out.println(annotation.num());
			for (String color : annotation.colors()) {
				System.out.println(color);
			}
		}
	}

	@Test
	public void testGetMethodAnnotation()throws Exception {
		//1.获取Person类的字节码对象
		Class<Person> personClass = Person.class;

		//2.判断该方法上是否有@MyAnnotation该注解,如果有再去获取,如果没有什么操作也不做
		Method method = personClass.getMethod("getAge");
		if (method.isAnnotationPresent(MyAnnotation.class)) {
			//3.获取方法上注解
			MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);

			//4.获取注解上的属性值
			System.out.println(annotation.name());
			System.out.println(annotation.num());
			for (String color : annotation.colors()) {
				System.out.println(color);
			}

		}
	}
}
